const vscode = require('vscode');

/**
 * 注册与 ezOne 状态相关的命令。
 * @param {Function} updateDecorationsCallback 用于在修改文档后更新装饰器的回调函数。
 * @returns {vscode.Disposable[]} 包含所有注册命令的 Disposable 数组。
 */
function registerEzOneStateCommands(updateDecorationsCallback) {
    const disposables = [];

    // --- 设置 ezOne 状态命令 ---
    const setEzOneStateCommand = vscode.commands.registerCommand('extension.setEzOneState', async (ezOneNumber, lineNumber) => {
        const editor = vscode.window.activeTextEditor;
        if (!editor) {
            vscode.window.showWarningMessage('没有活动的文本编辑器。');
            return;
        }

        // 定义预置的状态选项，增加“删除状态”选项，移除“自定义状态”
        const predefinedStates = ['进行中', '联调中', '已提测', '提测问题修复', '已完成', '删除状态'];

        // 使用 showQuickPick 让用户选择一个状态
        const selectedState = await vscode.window.showQuickPick(predefinedStates, {
            placeHolder: `为 ezOne-${ezOneNumber} 选择一个状态`,
            canPickMany: false,
            ignoreFocusOut: true, // 保持焦点，用户可以按ESC取消
        });

        if (!selectedState) {
            return;
        }

        const line = editor.document.lineAt(lineNumber);
        const lineText = line.text;

        // 匹配已存在状态的正则表达式：从 "ezOne-编号" 开始，到行尾的冒号和分号之间的文本
        // group 1: ezOne-编号及后面到冒号前的部分 (ezOne-123 或 ezOne-123 code)
        // group 2: 冒号开始到分号或行尾的整个状态文本，包括冒号和分号本身（如 ": 状态;" 或 ": 状态"）
        const existingStateRegex = new RegExp(`(ezOne-${ezOneNumber}[^:]*?)(:\\s*[^;]*;?)`);
        const match = lineText.match(existingStateRegex);

        let editOperationPromise;

        // 判断是否选择了“删除状态”
        if (selectedState === '删除状态') {
            // 用户选择删除状态
            if (match && match.index !== undefined) {
                const startIndex = match.index + match[1].length; // 定位到ezOne编号后第一个冒号的起始位置
                const endIndex = match.index + match[0].length; // 定位到整个匹配项的结束位置

                const startPosition = new vscode.Position(lineNumber, startIndex);
                const endPosition = new vscode.Position(lineNumber, endIndex);
                const rangeToDelete = new vscode.Range(startPosition, endPosition);

                editOperationPromise = editor.edit(editBuilder => {
                    // 检查原始匹配的文本中是否包含分号
                    if (match[2] && match[2].includes(';')) {
                        // 如果状态部分包含分号，则删除冒号和状态内容，只留下一个分号
                        editBuilder.replace(rangeToDelete, ';');
                    } else {
                        // 如果状态部分不含分号（例如 ": 状态"），则直接删除冒号和状态内容
                        editBuilder.delete(rangeToDelete);
                    }
                });
            } else {
                // 没有状态可删除
                vscode.window.showInformationMessage(`ezOne-${ezOneNumber} 所在行没有匹配到可移除的状态。`);
                return;
            }
        } else {
            // 用户选择了预设状态
            const newStateText = `: ${selectedState};`;
            if (match && match.index !== undefined) {
                // 如果已存在状态，则更新它
                const startIndex = match.index + match[1].length; // 定位到ezOne编号后第一个冒号的起始位置
                const endIndex = match.index + match[0].length; // 定位到整个匹配项的结束位置

                const rangeToReplace = new vscode.Range(new vscode.Position(lineNumber, startIndex), new vscode.Position(lineNumber, endIndex));

                editOperationPromise = editor.edit(editBuilder => {
                    editBuilder.replace(rangeToReplace, newStateText);
                });
            } else {
                // 如果不存在状态，则在行末添加
                let insertPosition = new vscode.Position(lineNumber, lineText.length);
                let textToInsert = newStateText;

                // 检查行末是否已存在分号，避免双重分号
                // trimEnd() 用于去除末尾空白字符，然后判断是否以分号结尾
                if (lineText.trimEnd().endsWith(';')) {
                    // 如果以分号结尾，则将新状态插入到分号之前
                    insertPosition = new vscode.Position(lineNumber, lineText.trimEnd().length - 1);
                    textToInsert = `: ${selectedState}`; // 不带分号，因为它已经存在
                }

                editOperationPromise = editor.edit(editBuilder => {
                    editBuilder.insert(insertPosition, textToInsert);
                });
            }
        }

        if (editOperationPromise) {
            editOperationPromise.then(success => {
                if (success) {
                    if (updateDecorationsCallback) {
                        updateDecorationsCallback(); // 更新装饰器
                    }
                    // 移除成功提示：vscode.window.showInformationMessage(`ezOne-${ezOneNumber} 的状态已更新。`);
                } else {
                    vscode.window.showErrorMessage(`无法为 ezOne-${ezOneNumber} 设置状态。`);
                }
            });
        }
    });
    disposables.push(setEzOneStateCommand);

    return disposables;
}

// 导出注册函数
module.exports = {
    registerEzOneStateCommands
};